<?php
/**
 * Created by PhpStorm.
 * User: 84462
 * Date: 2015/7/28
 * Time: 15:42
 */
namespace DaChongQing\Controller;



class BonusController {
    public $openid;
    public $total;
    public $parameters = array();
    const mchid     = "1252370801"; //商户号
    const privatekey  = "U2ZqlI1AvF1Ac3nrm2GqTqgyOmlICxHP"; //私钥
    public function __construct($openid,$total){
        $this->openid = $openid;
        $this->total = $total;
        $this->parameters = array(
            'nonce_str' => '123123131231321',
            'sign' => self::SetSign($this->parameters),
            'mch_billno' => self::wxMchBillno('1252370801'),
            'mch_id' => C('MCH_ID'),
            'wxappid' => 'wx22c589512a2d5f61',
            'nick_name' => '我爱大重庆',
            'send_name' => '我爱大重庆',
            're_openid' => $this->openid,
            'total_amount' => $this->total,
            'min_value' => $this->total,
            'max_value' => $this->total,
            'total_num' => '1',
            'wishing' => '恭喜发财！',
            'client_ip' => '121.40.30.107',
            'act_name' => '恭喜发财',
            'remark' => '恭喜发财'
        );
    }
   

    /****************************************************
     * 微信提交API方法，返回微信指定JSON
     ****************************************************/

    public function wxHttpsRequest($url,$data = null){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }

    /****************************************************
     * 微信带证书提交数据 - 微信红包使用
     ****************************************************/

    public function wxHttpsRequestPem($url, $vars, $second=30,$aHeader=array()){
        $ch = curl_init();
        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        //这里设置代理，如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

        //以下两种方式需选择一种

        //第一种方法，cert 与 key 分别属于两个.pem文件
        //默认格式为PEM，可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem');
        //默认格式为PEM，可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');

        curl_setopt($ch,CURLOPT_CAINFO,'PEM');
        curl_setopt($ch,CURLOPT_CAINFO,getcwd().'/rootca.pem');

        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }

        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
        $data = curl_exec($ch);
        if($data){
            curl_close($ch);
            return $data;
        }
        else {
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error\n";
            curl_close($ch);
            return false;
        }
    }

    /****************************************************
     * 微信获取AccessToken 返回指定微信公众号的at信息
     ****************************************************/

    public function wxAccessToken(){
        return AccessToken();
    }

    /*****************************************************
     *   生成随机字符串 - 最长为32位字符串
     *****************************************************/
    public function wxNonceStr($length = 16, $type = FALSE) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        if($type == TRUE){
            return strtoupper(md5(time() . $str));
        }
        else {
            return $str;
        }
    }

    /*******************************************************
     *   微信商户订单号 - 最长28位字符串
     *******************************************************/

    public function wxMchBillno($mchid = NULL) {
        if(is_null($mchid)){
            if(self::mchid == "" || is_null(self::mchid)){
                $mchid = time();
            }
            else{
                $mchid = self::mchid;
            }
        }
        else{
            $mchid = substr(addslashes($mchid),0,10);
        }
        return $mchid.date("Ymd",time()).time();
    }

    /*******************************************************
     *   微信格式化数组变成参数格式 - 支持url加密
     *******************************************************/

    public function wxSetParam($parameters){
        if(is_array($parameters) && !empty($parameters)){
            $this->parameters = $parameters;
            return $this->parameters;
        }
        else{
            return array();
        }
    }

    /*******************************************************
     *   微信格式化数组变成参数格式 - 支持url加密
     *******************************************************/

    public function wxFormatArray($parameters = NULL, $urlencode = FALSE){
        if(is_null($parameters)){
            $parameters = $this->parameters;
        }
        $restr = "";//初始化空
        ksort($parameters);//排序参数
        foreach ($parameters as $k => $v){//循环定制参数
            if (null != $v && "null" != $v && "sign" != $k) {
                if($urlencode){//如果参数需要增加URL加密就增加，不需要则不需要
                    $v = urlencode($v);
                }
                $restr .= $k . "=" . $v . "&";//返回完整字符串
            }
        }
        if (strlen($restr) > 0) {//如果存在数据则将最后“&”删除
            $restr = substr($restr, 0, strlen($restr)-1);
        }
        return $restr;//返回字符串
    }

    /*******************************************************
     *   微信MD5签名生成器 - 需要将参数数组转化成为字符串[wxFormatArray方法]
     *******************************************************/

    public function SetSign()
    {
        $sign = $this->MakeSign();
        $this->parameters['sign'] = $sign;
        return $sign;
    }

    public function MakeSign()
    {
        //签名步骤一：按字典序排序参数
        ksort($this->parameters);
        $string = $this->ToUrlParams();
        //签名步骤二：在string后加入KEY
        $string = $string . "&key=".self::privatekey;
//          dump($this->parameters);
        //签名步骤三：MD5加密
        $string = md5($string);
        //签名步骤四：所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }

    public function ToUrlParams()
    {
        $buff = "";
        foreach ($this->parameters as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");
        return $buff;
    }


    /*******************************************************
     *   将数组解析XML - 微信红包接口
     *******************************************************/

    public function wxArrayToXml($parameters = NULL){
        if(is_null($parameters)){
            $parameters = $this->parameters;
        }

        if(!is_array($parameters) || empty($parameters)){
            die("参数不为数组无法解析");
        }

        $xml = "<xml>";
        foreach ($parameters as $key=>$val)
        {
            if (is_numeric($val))
            {
                $xml.="<".$key.">".$val."</".$key.">";
            }
            else
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
        }
        $xml.="</xml>";
        return $xml;
    }

}



//class BonusController
//{
//    /**
//     * @var $openid
//     */
//    public $openid;
//    /**
//     * @var $TotalAmount
//     */
//    public $TotalAmount;
//    /**
//     * @var $parameters
//     * $parameters = array(
//     *      'wxappid' => $arr['wxappid'],
//     *      'nick_name' => $arr['nick_name'],
//     *      'send_name' => $arr['send_name']，
//     *      'wishing' => $arr['wishing'],
//     *      'client_ip' => $arr['client_ip'],
//     *      'act_name' => $arr['act_name'],
//     *      'remark' => $arr['remark']
//     *  );
//     */
//    public $parameters;
//    /**
//     * 支付链接
//     */
//    const PAYURL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
//    /**
//     * 商户号
//     */
//    const MCHID = "1252370801";
//    /**
//     * 私钥
//     */
//    const KEY = "U2ZqlI1AvF1Ac3nrm2GqTqgyOmlICxHP";
//
//    public function __construct($openid, $TotalAmount, $var)
//    {
//        $this->openid = $openid;
//        $this->TotalAmount = $TotalAmount;
//        $this->parameters = array(
//            'nonce_str' => self::NonceStr(),
//            'sign' => self::sign($this->parameters),
//            'mch_billno' => self::MchBillno(),
//            'mch_id' => self::MCHID,
//            'wxappid' => $var['wxappid'],
//            'nick_name' => $var['nick_name'],
//            'send_name' => $var['send_name'],
//            're_openid' => $this->openid,
//            'total_amount' => $this->TotalAmount,
//            'min_value' => $this->TotalAmount,
//            'max_value' => $this->TotalAmount,
//            'total_num' => '1',
//            'wishing' => $var['wishing'],
//            'client_ip' => $var['client_ip'],
//            'act_name' => $var['act_name'],
//            'remark' => $var['remark']
//        );
//        if ($this->parameters == '' || !isset($this->parameters) || !is_array($this->parameters)) {
//            die("出现错误，参数微定义或未定义完全！");
//        }
//    }
//
//    /**
//     * 带支付证书提交数据
//     */
//    public function SendBonus($second = 30, $aHeader = array())
//    {
//        $ch = curl_init();
//        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
//        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//        curl_setopt($ch, CURLOPT_URL, self::PAYURL);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
//        curl_setopt($ch, CURLOPT_SSLCERT, getcwd() . '/apiclient_cert.pem');
//        curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
//        curl_setopt($ch, CURLOPT_SSLKEY, getcwd() . '/apiclient_key.pem');
//        curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
//        curl_setopt($ch, CURLOPT_CAINFO, getcwd() . '/rootca.pem');
//        if (count($aHeader) >= 1) {
//            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
//        }
//        curl_setopt($ch, CURLOPT_POST, 1);
//        curl_setopt($ch, CURLOPT_POSTFIELDS, self::ArrayToXml());
//        $data = curl_exec($ch);
//        if ($data) {
//            curl_close($ch);
//            return $data;
//        } else {
//            $error = curl_errno($ch);
//            echo "返回错误:$error\n";
//            curl_close($ch);
//            return false;
//        }
//    }
//
//    /**
//     * @return string 把数组转换为xml
//     */
//    public function ArrayToXml()
//    {
//        $parameters = $this->parameters;
////        dump($parameters);
//        $xml = "<xml>";
//        foreach ($parameters as $key => $val) {
//            if (is_numeric($val)) {
//                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
//            } else {
//                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
//            }
//        }
//        $xml .= "</xml>";
//        return $xml;
//    }
//
//    /**
//     * @param int $length
//     * @param bool $type
//     * @return string 随机字符串，这里默认16个长度
//     */
//    public function NonceStr($length = 16, $type = FALSE)
//    {
//        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//        $str = "";
//        for ($i = 0; $i < $length; $i++) {
//            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
//        }
//        if ($type == TRUE) {
//            return strtoupper(md5(time() . $str));
//        } else {
//            return $str;
//        }
//    }
//
//    /**
//     * @return string 微信签名
//     */
//    public function sign($var)
//    {
//        $parameters = $var;
//        ksort($parameters);
//        $buff = "";
//        foreach ($parameters as $k => $v) {
//            if ($k != "sign" && $v != "" && !is_array($v)) {
//                $buff .= $k . "=" . $v . "&";
//            }
//        }
//        $buff = trim($buff, "&");
//        $string = $buff . "&key=" . self::KEY;
//        $string = md5($string);
//        $result = strtoupper($string);
//        return $result;
//    }
//
//    /**
//     * @param string $mchid
//     * @return string
//     */
//    public function MchBillno($mchid = self::MCHID)
//    {
//        if (is_null($mchid)) {
//            if ($mchid == "" || is_null($mchid)) {
//                $mchid = time();
//            }
//        } else {
//            $mchid = substr(addslashes($mchid), 0, 10);
//        }
//        return $mchid . date("Ymd", time()) . time();
//    }
//}